
package Presentation;


import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.web.WebView;
import Service.FactoryServices;
import Service.IGestionNavigation;

class FenetrePrincipale extends Scene
{
    
    private static Group root = new Group();
    
    // éléments constament sur la fenêtre
    
    // Accès application
    Presentation         p;
    
    // Accès Service
    IGestionNavigation   gestionNavigation = FactoryServices.gestionNavigation();
    
    // élément de la barre de menu
    MenuBar              menuBar           = new MenuBar();
    MenuFichier          menuFichier       = new MenuFichier(this);
    MenuFavoris          menuFavori        = new MenuFavoris(this);
    MenuHistorique       menuHistorique    = new MenuHistorique(this);
    MenuOption           menuOption        = new MenuOption(this);
    
    // élément de la barre de navigation
    HBox                 barreNavigation   = new HBox();
    BoutonRetour         bRetour           = new BoutonRetour(this, 100, 20);
    boolean              enabledRetour     = false;
    BoutonAller          bAller            = new BoutonAller(this, 100, 20);
    boolean              enabledAller      = false;
    int                  index             = 0;
    BoutonURL            bValidURL         = new BoutonURL(this, 100, 20);
    TextFieldURL         tfURL             = new TextFieldURL(this, 250, 20);
    BoutonCreaFav        bCreaFavori       = new BoutonCreaFav(this, 150, 20);
    BoutonRafraichir     bRafraichir       = new BoutonRafraichir(this, 100, 20);
    
    // élément du panneau d'affichage
    StackPane            panneau           = new StackPane();
    List<WebView>        navigList         = new ArrayList<WebView>(5);
    
    // Constructeur
    public FenetrePrincipale(Presentation p) {
    
        super(root, Color.SILVER);
        this.p = p;
        this.build();
        
    }
    
    // Construction de la Fenetre Principale
    // --------------------------------------------------------------------------------------------------------------------
    public void build() {
    
        // Chargement en mémoire de l'historique (et des favoris?)
        // ---------------------------------------------------------------------------------------------
        gestionNavigation.loadHistorique();
        gestionNavigation.loadFavoris();
        gestionNavigation.loadPageAccueil();
        
        // Création de la bare de menu
        // ---------------------------------------------------------------------------------------------
        menuBar.getMenus().addAll(menuFichier, menuFavori, menuHistorique, menuOption);
        
        // Création de la bare de navigation
        // ---------------------------------------------------------------------------------------------
        this.bRetour.setEnabled(false);
        this.bAller.setEnabled(false);
        barreNavigation.setPadding(new Insets(0, 0, 10, 0));
        barreNavigation.setSpacing(10);
        barreNavigation.getChildren().addAll(bRetour, bAller, bCreaFavori, tfURL, bValidURL, bRafraichir);
        
        // Création du panneau d'affichage de la page web
        // ---------------------------------------------------------------------------------------------
        
        URL url = this.gestionNavigation.getPageAccueil();

        WebView browser = new WebView();
        this.navigList.add(0, browser);
        this.navigList.get(0).getEngine().load(url.toString());
        this.tfURL.setText(url.toString());
        panneau.getChildren().add(this.navigList.get(0));
        this.gestionNavigation.createHistorique(new Date(), url);
        
        // Mise en place des différentes lignes
        // ---------------------------------------------------------------------------------------------
        
        VBox orga = new VBox();
        orga.setPadding(new Insets(10));
        orga.setSpacing(2);
        orga.getChildren().addAll(menuBar, barreNavigation, panneau);
        
        this.root.getChildren().add(orga);
        
    }
    
    public void Fermeture() {
    
        this.gestionNavigation.saveFavoris();
        this.gestionNavigation.saveHistorique();
        this.gestionNavigation.savePageAccueil();
    }
    
    public void nouvellePage(String lien){
        String http = "http://";
        String https = "https://";
        String www = "www.";
    
        // tester si l'url contient 'http' ou 'https'
        if ((!lien.subSequence(0, 7).equals(http)) && (!lien.subSequence(0, 8).equals(https))) {
            if ((!lien.subSequence(0, 4).equals(www))) {
                lien = www + lien;
            }
            lien = http + lien;
        }
        
        URL url=null;
        try {
            url = new URL(lien);
        } catch (MalformedURLException m) {
            m.printStackTrace();
        }
        if(url!=null){
            this.nouvellePage(url);
        }else{
            System.out.println("Url non valide");
        }
    }

    public void nouvellePage(URL url){
        this.bRetour.setEnabled(true);
        this.bAller.setEnabled(false);

        WebView  browser = new WebView();
    
        if(this.index!=0){
            int i;
            for(i=0;i<this.index;i++){
                this.navigList.remove(0);
            }
            this.index=0;
        }

        if(this.navigList.size()>=5){
            this.navigList.remove(4);
        }
        this.navigList.add(0,browser);
        this.navigList.get(0).getEngine().load(url.toString());
        this.tfURL.setText(url.toString());
        this.panneau.getChildren().add(this.navigList.get(0));
        this.navigList.get(1).setVisible(false);
        this.gestionNavigation.createHistorique(new Date(), url);
    }
    
}
